package com.xiao.user.mapper;

import org.mapstruct.BeanMapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.Named;
import org.mapstruct.NullValuePropertyMappingStrategy;

import java.util.List;

/**
 * @param <D> - DTO type parameter.
 * @param <E> - Entity type parameter.
 */
public interface EntityMapper<D, E> {

    E toEntity(D dto);

    D toDto(E entity);

    @Named("simple")
    default D toSimpleDto(E entity) {
        return toDto(entity);
    };

    @Named("full")
    default D toFullDto(E entity) {
        return toDto(entity);
    };

//    @Named("full")
//    default List <D> toFullDto(List<E> entityList) {
//        if ( entityList == null ) {
//            return null;
//        }
//
//        List<D> list = new ArrayList<>( entityList.size() );
//        for ( E entity : entityList ) {
//            list.add( toFullDto( entity ) );
//        }
//
//        return list;
//    }

    List <E> toEntity(List<D> dtoList);

    List <D> toDto(List<E> entityList);

    @Named("partial")
    @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
    void partialUpdate(@MappingTarget E entity, D dto);
}
